package com.nenude.corejava.ch12;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import test.newfile;

public class TestStudent {
	/**
	 * 保存学生信息的文件
	 */
	private static final String FILE_NAME = "c:\\student.data";

	// 编写一段代码，从键盘输入3个学生的信息，并保存到文件中；
	
	public static void inputStudentInfo() {
		Scanner scanner = new Scanner(System.in);
		System.out.println("输入3个学生的信息：");

		List<Student> list = new ArrayList<Student>();

		// 局部变量，创建对象必须要初始化
		Student student = null;

		for (int i = 0; i < 3; i++) {

			int id = 0;
			while (true) {
				try {
					System.out.println("请输入学号：");
					String idString = scanner.nextLine();
					id = Integer.parseInt(idString);
					break;
				} catch (NumberFormatException e) {
				}
			}

			System.out.println("请输入姓名：");
			String nameString = scanner.nextLine();

			int age = 0;
			while (true) {
				try {
					System.out.println("请输入年龄：");
					String ageString = scanner.nextLine();
					age = Integer.parseInt(ageString);
					break;
				} catch (NumberFormatException e) {
				}
			}
			
			
			System.out.println("请输入性别：");
			String sexString = scanner.nextLine();

			student = new Student(id, nameString, age, sexString);

			list.add(student);
		}

		// 文件定位
		File file = new File(FILE_NAME);
		FileOutputStream outputStream = null;
		// 对象流写文件
		ObjectOutputStream objectOutputStream = null;

		try {
			// 判断文件是否存在
			if (!file.exists()) {
				// 检查目录是否存在
				file.getParentFile().mkdirs();
				file.createNewFile();
			}

			// 操作文件--节点流
			outputStream = new FileOutputStream(file);
			// 对流进行包装转换---处理流
			objectOutputStream = new ObjectOutputStream(outputStream);
			// 使用对象流把一个 java.io.Object 类的对象输出到一个流(网络流、管道流、文件流);
			objectOutputStream.writeObject(list);

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (objectOutputStream != null) {
				try {
					objectOutputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (outputStream != null) {
				try {
					outputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	//反序列化：
	public static void readDataFromFile(){
		//1·定位文件
		File file=new File(FILE_NAME);
		if(!file.exists()){
			System.out.println("找不到文件！"+FILE_NAME);
			return ;
		}
		
		//读文件
		FileInputStream fileInputStream=null;
		ObjectInputStream objectInputStream=null;
		try {
			fileInputStream=new FileInputStream(file);
			objectInputStream=new ObjectInputStream(fileInputStream);
		Object object=objectInputStream.readObject();
			
		//向下溯性（还原）
		List<Student> list=(List<Student>) object;
		for(Student student:list){
			System.out.println(student);
		}
		
		
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}finally{
			if(objectInputStream!=null){
				try {
					objectInputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(fileInputStream!=null){
				try {
					fileInputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	

	public static void main(String[] args) {

		// 编写一段代码，从键盘输入3个学生的信息，并保存到文件中；
		//inputStudentInfo();//序列化对象到文件中
		
		// 编写一段代码，从文件中读取数据并还原为一组学生信息；
		readDataFromFile();

	}

}
